﻿using System.Linq;
using System.Web.Mvc;
using Telerik.Web.Mvc;
using Transport.Areas.Administrator.Models;
using Transport.Core.Models.Settings;
using Transport.Infrastructure;
using Transport.Infrastructure.Mvc;
using Transport.Infrastructure.Security;
using Transport.Services;
using Transport.Services.Infrastructure;
using Transport.Services.Settings;
using System.Data.Entity;
using System.Globalization;

namespace Transport.Areas.Administrator.Controllers
{
    [Authorize]
    public class RegionController : ControllerBase<IRegionRepository, Region>
    {
        private readonly IStateProvinceBelongToRegionRepository _stateProvinceBelongToRegionRepository;
        private readonly IStateProvinceRepository _stateProvinceRepository;
        private readonly IMyOfficeRepository _myOfficeRepository;
        public RegionController(IUnitOfWork unitOfWork, IRegionRepository repository,
                                IStateProvinceBelongToRegionRepository stateProvinceBelongToRegionRepository,
                                IStateProvinceRepository stateProvinceRepository, IMyOfficeRepository myOfficeRepository)
            : base(repository, unitOfWork)
        {
            _stateProvinceBelongToRegionRepository = stateProvinceBelongToRegionRepository;
            _stateProvinceRepository = stateProvinceRepository;
            _myOfficeRepository = myOfficeRepository;
        }
        //
        // GET: /Administrator/Region/

        public ActionResult Index()
        {
            return View();
        }
        
        [GridAction]
        public ActionResult GridModel(string search)
        {
            var model = Repository.Search(search).Where(p => p.MyOfficeId == WorkContext.MyOfficeId);

            var gridModel = new GridModel<RegionModel>
            {
                Data = model.Select(x => new RegionModel
                                             {
                                                 RegionId = x.RegionId,
                                                 RegionName = x.RegionName
                                             })
            };
            return new JsonResult
            {
                Data = gridModel
            };
        }

        public ActionResult Create()
        {
            var model = new RegionModel();

            return View(model);
        }

        public virtual ActionResult Edit(int id)
        {
            var entity = Repository.GetById(id);
            var model = new RegionModel()
            {
                RegionId = entity.RegionId,
                RegionName = entity.RegionName

            };
            return View("Edit", model);
        }

        [HttpPost, ValidateInput(false)]
        public virtual ActionResult Save(RegionModel regionModel)
        {
            if (!ModelState.IsValid)
            {
                return View("Create", regionModel);
            }
            //Check existed
            var modelExisted = Repository.GetAll().FirstOrDefault(p => p.RegionName == regionModel.RegionName && p.MyOfficeId == WorkContext.MyOfficeId);
            if ((modelExisted != null && modelExisted.RegionId != regionModel.RegionId) || (modelExisted != null && regionModel.RegionId <= 0))
            {
                this.SetErrorNotification("Thùng này đã tồn tại trong hệ thống.");
                return View("Create", regionModel);
            }
            if (regionModel.RegionId <= 0) //Create
            {
                var region = new Region()
                {
                    IsDeleted = false,
                    RegionName = regionModel.RegionName,
                    MyOfficeId = WorkContext.MyOfficeId
                };
                using (UnitOfWork)
                {
                    Repository.Insert(region);
                }
                this.SetSuccessNotification(string.Format("{0} đã được lưu thành công.", "Thùng"));
                return RedirectToAction("Edit", new { id = region.RegionId, area = "Administrator" });
            }
            else //Edit
            {
                var region = Repository.GetById(regionModel.RegionId);
                region.RegionName = regionModel.RegionName;
                using (UnitOfWork)
                {
                    Repository.Update(region);
                }
                this.SetSuccessNotification(string.Format("{0} đã được lưu thành công.", "Thùng"));
                return RedirectToAction("Edit", new { id = region.RegionId, area = "Administrator" });
            }

            //Save success
            this.SetSuccessNotification(string.Format("{0} đã được lưu thành công.", "Thùng"));
            return RedirectToAction("Index", new { area = "Administrator" });
        }

        public ActionResult Delete(int id)
        {
            try
            {
                using (UnitOfWork)
                {
                    Repository.Delete(id);
                    var stateProvinceBelongToRegions = _stateProvinceBelongToRegionRepository.GetAll().Where(p => p.RegionId == id);
                    foreach (var item in stateProvinceBelongToRegions)
                    {
                        _stateProvinceBelongToRegionRepository.Delete(item.StateProvinceBelongToRegionId);
                    }
                }
                this.SetSuccessNotification("Thùng đã được xóa thành công.");
            }
            catch
            {
                this.SetErrorNotification("Thùng này không thể xóa, vì đã được sử dụng!");
            }
            return RedirectToAction("index", new { area = "Administrator" });
        }

        #region StateProvinde Belongto Region
        [GridAction]
        public ActionResult GetStateProvinceBelongToRegions(int regionId)
        {
            var query = from x in _stateProvinceBelongToRegionRepository.GetAll().Include(p => p.StateProvince).Include(p => p.Region)
                        where x.RegionId == regionId
                        select new StateProvinceBelongToRegionModel
                        {
                            RegionId = x.RegionId,
                            StateProvinceBelongToRegionId = x.StateProvinceBelongToRegionId,
                            StateProvinceId = x.StateProvinceId,
                            StateProvinceName = x.StateProvince.StateProvinceName,
                            StateProvinceCode = x.StateProvince.StateProvinceCode
                        };

            var gridModel = new GridModel<StateProvinceBelongToRegionModel>
            {
                Data = query.ToList()
            };
            return new JsonResult
            {
                Data = gridModel
            };
        }

        public ActionResult CreateStateProvinceBelongToRegion(int regionId)
        {
            var stateProvinceHaveConfigured = _stateProvinceBelongToRegionRepository.GetAll().Where(o => o.MyOfficeId == WorkContext.MyOfficeId).Select(p => p.StateProvinceId).AsEnumerable();
            var stateProvinces = _stateProvinceRepository.Search("").Where(p => !stateProvinceHaveConfigured.Contains(p.StateProvinceId)).ToList();
            var offices = _myOfficeRepository.Search("").ToList();
            var model = new StateProvinceBelongToRegionModel()
                {
                    StateProvinces = stateProvinces.Select(t => new GroupedSelectListItem
                    {
                        GroupKey = t.MyOfficeId.ToString(),
                        GroupName = offices.FirstOrDefault(p => p.MyOfficeId == t.MyOfficeId).OfficeName,
                        Text = t.StateProvinceName,
                        Value = t.StateProvinceId.ToString(CultureInfo.InvariantCulture)
                    }).ToList(),
                    RegionId = regionId
                };

            return View(model);
        }

        [HttpPost, ValidateInput(false)]
        public virtual ActionResult SaveStateProvinceBelongToRegion(StateProvinceBelongToRegionModel stateProvinceBelongToRegionModel)
        {
            if (!ModelState.IsValid)
            {
                var stateProvinces = _stateProvinceRepository.Search("").ToList();
                var offices = _myOfficeRepository.Search("").ToList();
                stateProvinceBelongToRegionModel.StateProvinces = stateProvinces.Select(t => new GroupedSelectListItem
                    {
                        GroupKey = t.MyOfficeId.ToString(),
                        GroupName = offices.FirstOrDefault(p => p.MyOfficeId == t.MyOfficeId).OfficeName,
                        Text = t.StateProvinceName,
                        Value = t.StateProvinceId.ToString(CultureInfo.InvariantCulture)
                    }).ToList();
                return View("CreateStateProvinceBelongToRegion", stateProvinceBelongToRegionModel);
            }
            //Check existed
            var modelExisted = _stateProvinceBelongToRegionRepository.GetAll().FirstOrDefault(p => p.StateProvinceId == stateProvinceBelongToRegionModel.StateProvinceId && p.MyOfficeId == WorkContext.MyOfficeId);
            if ((modelExisted != null && modelExisted.StateProvinceBelongToRegionId != stateProvinceBelongToRegionModel.StateProvinceBelongToRegionId) || (modelExisted != null && stateProvinceBelongToRegionModel.StateProvinceBelongToRegionId <= 0))
            {
                this.SetErrorNotification("Tỉnh này đã được tạo mới.");
                var stateProvinces = _stateProvinceRepository.Search("").ToList();
                var offices = _myOfficeRepository.Search("").ToList();
                stateProvinceBelongToRegionModel.StateProvinces = stateProvinces.Select(t => new GroupedSelectListItem
                {
                    GroupKey = t.MyOfficeId.ToString(),
                    GroupName = offices.FirstOrDefault(p => p.MyOfficeId == t.MyOfficeId).OfficeName,
                    Text = t.StateProvinceName,
                    Value = t.StateProvinceId.ToString(CultureInfo.InvariantCulture)
                }).ToList();
                return View("CreateStateProvinceBelongToRegion", stateProvinceBelongToRegionModel);
            }
            if (stateProvinceBelongToRegionModel.StateProvinceBelongToRegionId <= 0) //Create
            {
                var entity = new StateProvinceBelongToRegion()
                {
                    IsDeleted = false,
                    StateProvinceId = stateProvinceBelongToRegionModel.StateProvinceId,
                    RegionId = stateProvinceBelongToRegionModel.RegionId,
                    MyOfficeId = WorkContext.MyOfficeId
                };
                using (UnitOfWork)
                {
                    _stateProvinceBelongToRegionRepository.Insert(entity);
                }
                this.SetSuccessNotification(string.Format("{0} đã được lưu vào thùng thành công.", "Tỉnh"));
                return RedirectToAction("Edit", new { id = stateProvinceBelongToRegionModel.RegionId, area = "Administrator" });
            }
            else //Edit
            {
                var entity = _stateProvinceBelongToRegionRepository.GetById(stateProvinceBelongToRegionModel.StateProvinceBelongToRegionId);
                entity.StateProvinceId = stateProvinceBelongToRegionModel.StateProvinceId;
                using (UnitOfWork)
                {
                    _stateProvinceBelongToRegionRepository.Update(entity);
                }
                this.SetSuccessNotification(string.Format("{0} đã được lưu vào thùng thành công.", "Tỉnh"));
                return RedirectToAction("Edit", new { id = stateProvinceBelongToRegionModel.RegionId, area = "Administrator" });
            }

            //Save success
            this.SetSuccessNotification(string.Format("{0} đã được lưu thành công.", "Thùng"));
            return RedirectToAction("Index", new { area = "Administrator" });
        }

        public ActionResult DeleteStateProvinceBelongToRegion(int id)
        {
            int regionId=0;
            try
            {
                using (UnitOfWork)
                {
                    var entity = _stateProvinceBelongToRegionRepository.GetById(id);
                    if (entity != null)
                    {
                        regionId = entity.StateProvinceBelongToRegionId;
                    }
                    _stateProvinceBelongToRegionRepository.Delete(id);
                }
                this.SetSuccessNotification("Tỉnh thành đã được xóa từ thùng thành công.");
            }
            catch
            {
                this.SetErrorNotification("Tình thành này không thể xóa khỏi Thùng, vì đã được sử dụng!");
            }
            if (regionId > 0)
            {
                return RedirectToAction("Edit", new { id = regionId, area = "Administrator" }); 
            }
            return RedirectToAction("index", new { area = "Administrator" });
        }

        #endregion
    }
}
